#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>

// 数据类型定义
typedef int ElementType;

// 链栈节点结构
typedef struct StackNode {
    ElementType data;
    struct StackNode* next;
} StackNode;

// 初始化栈
void init(StackNode **top) {
    *top = NULL;
}

// 判断栈是否为空
bool isEmpty(StackNode* top) {
    return top == NULL;
}

// 获取栈长度
int stackLength(StackNode* top) {
    int length = 0;
    StackNode* p = top;

    while (p != NULL) {
        length++;
        p = p->next;
    }
    return length;
}

//打印链栈元素
void printStack(StackNode** top) {
    if (top == NULL) {
        printf("这是空栈！\n");
        return;
    }
    printf("栈元素（从栈顶到栈底）: \n");
    StackNode* p = *top;
    while (p != NULL) {
        printf("%d ", p->data);
        p = p->next;
    }
    printf("\n");
}

// 入栈
bool pushStack(StackNode **top, ElementType n) {
    StackNode* newNode = (StackNode*)malloc(sizeof(StackNode));
    if (!newNode) {
        printf("内存分配失败！\n");
        return false;
    }
    newNode->data = n;
    newNode->next = *top;
    *top = newNode;
    return true;
}

//出栈
bool popStack(StackNode **top){
    if (top == NULL) {
        printf("这是空栈！无法出栈\n");
        return false;
    }

    StackNode *p = *top; //保存栈顶指针
    *top =  p->next; //栈顶下移一位
    free(p);
    return true;
}

// 获取栈顶元素
bool getTop(StackNode** top) {
    if (isEmpty(top)) {
        printf("栈为空！\n");
        return false;
    }
    StackNode* p = *top;
    printf("栈顶元素是： %d\n", p->data);
    return true;
}


int main(){
    // 设置控制台为UTF-8编码
    #ifdef _WIN32
    system("chcp 65001 > null");
    #endif

    StackNode  *s;
    //初始化
    init(&s);

    //入栈
    pushStack(&s,51);
    pushStack(&s,24);
    pushStack(&s,61);

    //打印元素
    printStack(&s);

    // 打印栈长度
    int length = stackLength(s);
    printf("栈长度: %d\n", length);

    printf("\n");

    //出栈
    popStack(&s);

    printStack(&s);
    length = stackLength(s);
    printf("栈长度: %d\n", length);

    printf("\n");

    //获取栈顶元素
    getTop(&s);


    return 0;
}
